[PB Generic表][C++ SDK]通过本地索引批量删除记录
1. 接口说明
通过本地索引查询批量删除记录(example路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/delete_by_index)
注意:一次删除过多的记录可能会导致大时延,达到秒级,建议用户限制每次删除的记录的数量(建议每次不超过1024条)
2. 版本要求
无特殊要求,所有版本都提供了该接口。
3. 准备工作
参见准备工作文档,完成使用该接口前的准备工作,并创建如下PB Generic表,并使用PB工具转换为C++代码。
syntax = "proto2";
package myTcaplusTable;
import "tcaplusservice.optionv1.proto";
message tb_online {
option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";
required int32 openid = 1; //QQ Uin
required int32 tconndid = 2;
required string timekey = 3;
required string gamesvrid = 4;
optional int32 logintime = 5 [default = 1];
repeated int64 lockid = 6 [packed = true]; //repeated类型字段使用packed关键字修饰
optional pay_info pay = 7;
message pay_info {
optional uint64 total_money = 1;
optional uint64 pay_times = 2;
}
}
准备工作完成后,将会获得以下信息,这些信息在使用SDK时会被用到:
- 目录服务器地址列表
- 业务ID
- 业务访问密码
- 游戏区ID
- 数据表名
4. 示例代码
4.1 异步调用示例代码
示例代码的基本执行过程:
- 定义表配置参数;
- 创建客户端;
- 定义回调函数,处理响应;
- 发送请求;
- example框架;
第1,2,5步是所有示例的通用代码,重点关注第3步和第4步,发送请求和响应处理的回调函数
4.1.1 定义数据库表配置参数(代码路径:examples/tcaplus/C++_common_for_pb/common.h)
主要设置表的相关配置参数,在代码文件的头部
// 目标业务的tcapdir地址
static const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] =
{
"tcp://10.191.***.99:9999"
};
// 目标业务的tcapdir 地址个数
static const int32_t DIR_URL_COUNT = 1;
// 目标业务的集群ID
static const int32_t APP_ID = 3;
// 目标业务的表格组ID
static const int32_t ZONE_ID = 1;
// 目标业务的业务密码
static const char * SIGNATURE = "*******";
// 目标业务的表名 tb_online
static const char * TABLE_NAME = "tb_online";
4.1.2 创建SDK客户端(代码路径:examples/tcaplus/C++_common_for_pb/common.h)
通过日志配置文件tlogconf.xml创建日志句柄,用于SDK的日志打印;通过该代码创建一个Tcaplus客户端,该客户端只允许单线程使用,多线程模型可以在每个线程上初始化一个客户端实例
//Tcaplus PB API客户端
TcaplusAsyncPbApi g_stAsyncApi;
int32_t InitAsyncPbApi()
{
//PB API配置
ClientOptions cfg;
cfg.app_id = APP_ID;
cfg.zones.push_back(ZONE_ID);
strcpy(cfg.signature, SIGNATURE);
for (int32_t i = 0; i < DIR_URL_COUNT; i++)
{
cfg.dirs.push_back(DIR_URL_ARRAY[i]);
}
//访问的PB表
cfg.tables.push_back(TABLE_NAME);
//日志配置
strncpy(cfg.log_cfg, "tlogconf.xml", sizeof(cfg.log_cfg));
//初始化连接超时时间5s
cfg.timeout = 5000;
//初始化连接
int32_t iRet = g_stAsyncApi.Init(cfg);
if (0 != iRet)
{
cout << "ERROR: g_stAsyncApi.Init failed, log cfg: " << cfg.log_cfg << ", iRet: " << iRet << "." << endl;
return iRet;
}
return iRet;
}
4.1.3 定义回调函数,处理响应(代码路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/delete_by_index/main.cpp)
class CommonCallback : public TcaplusPbCallback
{
public:
CommonCallback()
{
cout << "Init CommonCallback." << endl;
}
~CommonCallback()
{
cout << "Fini ~CommonCallback." << endl;
}
int OnRecv(const NS_TCAPLUS_PROTOBUF_API::IndexDeleteRequest &req, NS_TCAPLUS_PROTOBUF_API::IndexDeleteResponse *res)
{
cout << "req " << (void *)&req << endl;
g_dwTotalRevNum++;
cout << "Total: " << res->m_nTotalNum << " Success: " << res->m_nSuccNum;
return 0;
}
int OnError(const std::vector< ::google::protobuf::Message *> &msgs, int errorcode)
{
g_dwTotalRevNum++;
for (size_t idx = 0; idx < msgs.size(); idx++)
{
tb_online_index* t = dynamic_cast<tb_online_index *>(msgs[idx]);
if (NULL == t)
{
cout << "ERROR: msgs[" << idx << "] not tb_online_index type." << endl;
return -1;
}
if (TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST == errorcode)
{
cout << "ERROR: openid= " << t->openid() << ", tconndid= " << t->tconndid() << ", timekey= " << t->timekey() << ", record not exists" << endl;
}
else if (TcapErrCode::API_ERR_NO_MORE_RECORD == errorcode)
{
cout << "NO MORE RECORDS, FINISH" << endl;
}
else
{
cout << "openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] failed:" << errorcode << endl;
}
}
return 0;
}
int OnTimeout(const std::vector< ::google::protobuf::Message *> &msgs)
{
for (size_t idx = 0; idx < msgs.size(); idx++)
{
tb_online_index* t = dynamic_cast<tb_online_index *>(msgs[idx]);
if (NULL == t)
{
cout << "TIMEOUT: msgs[" << idx << "] not tb_online_index type!" << endl;
return -1;
}
cout << "TIMEOUT: openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] timeout" << endl;
}
return 0;
}
int OnFinish(const NS_TCAPLUS_PROTOBUF_API::MsgParam ¶m)
{
cout << "OnFinish: " << param.m_nOperation << " req: " << param.m_vecMsgs.size() << endl;
return 0;
}
};
4.1.4 发送请求(代码路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/delete_by_index/main.cpp)
使用客户端发送请求
void SendDeleteRequest(struct schedule * S, void* arg)
{
static tb_online_index t;
t.set_openid(1);
t.set_tconndid(1);
cout << "Delete By Index INIT: openid= " << t.openid() << ", tconndid= " << t.tconndid() << endl;
static CommonCallback cb;
static NS_TCAPLUS_PROTOBUF_API::IndexDeleteRequest req;
cout << "req: " << (void *)&req << endl;
req.m_strIndexName = "index_openid_tconndid";
req.m_pMsg = &t;
int32_t iRet = g_stAsyncApi.Del(req, &cb);
if (iRet != TcapErrCode::GEN_ERR_SUC)
{
cout << "ERROR: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << ", Get Error iRet = " << iRet << endl;
}
}
4.1.5 example异步框架(代码路径:examples/tcaplus/C++_common_for_pb/common.h)
通过实现回调函数的三个函数指针,proc主框架会调用相应的函数发送请求,接收响应和超时处理,该框架所有例子通用
int32_t main(int32_t argc, char* argv[])
{
int32_t iRet = 0;
//初始化
iRet = InitAsync("tlogconf.xml");
if (0 != iRet)
{
cout << "ERROR: Init failed, iRet: " << iRet << ", please check the tcaplus_pb.log for detail." << endl;
return iRet;
}
//设置回调函数
g_stPbCallbackFunctions.pfnSendRequest = SendDeleteRequest;
iRet = ProcAsync();
if (0 != iRet)
{
cout << "ERROR: ProcAsync failed, iRet: " << iRet << ", please check the tcaplus_pb.log for detail." << endl;
return iRet;
}
FinishAsync();
return 0;
}
// 初始化pb api
int32_t InitAsync(const char* log_conf)
{
int32_t iRet = 0;
iRet = InitAsyncPbApi(log_conf);
if (0 != iRet)
{
cout << "ERROR: InitCoroutinePbApi failed, iRet: " << iRet << "." << endl;
return iRet;
}
return iRet;
}
//************************************************************************
// Method: FinishAsync
// Returns:
// Qualifier: 函数退出时处理逻辑
//*************************************************************************/
void FinishAsync()
{
cout << "g_stAsyncApi finish!" << endl;
g_stAsyncApi.Fini();
google::protobuf::ShutdownProtobufLibrary();
}
//************************************
// Method: ProcAsync
// Returns: int32_t
// Qualifier: 处理函数
//************************************
int32_t ProcAsync()
{
int32_t iRet = 0;
// 本例子中使用变量iSendRequestCount是控制发包的数量
int32_t iSendRequestCount = 0;
do
{
if (iSendRequestCount < TOTAL_SEND_RECV_NUM)
{
if(NULL == g_stPbCallbackFunctions.pfnSendRequest)
{
cout << "ERROR: g_stPbCallbackFunctions.pfnSendRequest is NULL, so will finish example." << endl;
break;
}
int32_t iUin = iSendRequestCount;
g_stPbCallbackFunctions.pfnSendRequest(NULL, (void *)&iUin);
iSendRequestCount++;
}
// 更新,接收回包
g_stAsyncApi.UpdateNetwork();
usleep(TCAPLUS_SLEEEP_US);
} while (g_dwTotalRevNum != TOTAL_SEND_RECV_NUM);
cout << "end mytest, please check the mytest.log for detail." << endl;
return 0;
}
5. TcaplusAsyncPbApi主要接口的说明如下:
class TcaplusAsyncPbApi
{
public:
TcaplusAsyncPbApi();
virtual ~TcaplusAsyncPbApi();
/**
* @brief 初始化操作
*
* @param [IN] option 配置选项信息
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Init(NS_TCAPLUS_PROTOBUF_API::ClientOptions& option);
/**
* @brief 切换当前操作的区(表格组)
*
* @param [IN] zone_id 区(表格组)ID
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int SelectZone(uint32_t zone_id);
/**
* @brief 事件循环,网络收发包,驱动整个API的运行
*
* @retval >0 收到包
* @retval 0 正常。
* @retval <0 异常。
*/
int UpdateNetwork();
/**
* 设置消息的选项
* item取值有如下情况:
* a).MESSAGE_OPTION_VERSION_CHECK = 1, API中设置记录版本对比
* option取值有 "1":启用版本对比(默认)
* "2": 不启用版本对比,强制把MESSAGE_OPTION_DATA_VERSION指定的记录版本号写入到服务器中
* "3":不检测记录版本号,将服务器端的版本号自增
* b).MESSAGE_OPTION_DATA_VERSION = 2, API中设置记录版本功能
* option取值代表期望记录的版本号对应的字符串,比如"10",表示记录版本号为10
* c).MESSAGE_OPTION_ASYNC_ID = 3 API中设置设置消息的异步ID,异步ID是字符串形式的uint64_t数值
* option取值代表期望异步ID字符串,比如"13",表示异步ID为13
* d).MESSAGE_OPTION_MESSAGE_INVALID = 4 设置消息无效(在发送请求之后等消息还没回来之前生效)
* option取值代表期望异步ID字符串,比如"13",表示异步ID为13,如果没有设置异步ID保持为空
* e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5, API中设置设置消息的自动释放(异步模式生效)(不推荐)
* f).MESSAGE_OPTION_USER_BUFF = 6, API中设置用户传入的自定义二进制数据, 最长1024Bytes
* g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7, API中设置回调的自动释放(异步模式生效)(不推荐)
* h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
* i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
* j).MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS = 10, 用户显式设置请求执行成功时的响应标志,会覆盖API的默认配置
* option取值有 "0":表示只需返回操作执行成功与否
* "1":表示返回与请求字段一致
* "2":表示须返回变更记录的所有字段最新数据
* "3":表示须返回变更记录的所有字段旧数据
* k).MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL = 11, 用户显式设置请求执行失败时的响应标志,会覆盖API的默认配置
* option取值有 "0":表示只需返回操作执行成功与否
* "1":表示返回与请求字段一致
* "2":表示须返回变更记录的所有字段最新数据
* "3":表示须返回变更记录的所有字段旧数据
*/
int SetMessageOption(const ::google::protobuf::Message &msg, int32_t item, const std::string &option); // 为后续参数设置预留
/**
* 获取消息的选项
* item取值有如下情况:
* a).MESSAGE_OPTION_VERSION_CHECK = 1, 获取API中设定记录版本对比选项
* option返回值有 "1":启用版本对比(默认)
* "2": 不启用版本对比,强制把MESSAGE_OPTION_DATA_VERSION指定的记录版本号写入到服务器中
* "3":不检测记录版本号,将服务器端的版本号自增
* b).MESSAGE_OPTION_DATA_VERSION = 2, 获取API中设置记录版本选项
* option返回值代表之前设置的记录的版本号对应的字符串,比如"10",表示记录版本号为10
* c).MESSAGE_OPTION_ASYNC_ID = 3 获取API中设置设置消息的异步ID选项,异步ID是字符串形式的uint64_t数值
* option返回值代表之前设置的异步ID字符串,比如"13",表示异步ID为13
* d).MESSAGE_OPTION_MESSAGE_INVALID = 4 获取设置消息无效选项
* e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5, 获取设置设置消息的自动释放选项
* f).MESSAGE_OPTION_USER_BUFF = 6, 获取用户传入的自定义二进制数据
* g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7, API中设置回调的自动释放(异步模式生效)
* h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
* i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
* j).MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS = 10, 获取用户显式设置或API默认配置的请求执行成功时的响应标志
* option取值有 "0":表示只需返回操作执行成功与否
* "1":表示返回与请求字段一致
* "2":表示须返回变更记录的所有字段最新数据
* "3":表示须返回变更记录的所有字段旧数据
* k).MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL = 11, 获取用户显式设置或API默认配置的请求执行失败时的响应标志
* option取值有 "0":表示只需返回操作执行成功与否
* "1":表示返回与请求字段一致
* "2":表示须返回变更记录的所有字段最新数据
* "3":表示须返回变更记录的所有字段旧数据
*/
int GetMessageOption(const ::google::protobuf::Message &msg, int32_t item, std::string *option); // 为后续参数设置预留, 例如或取记录的version
/**
* 获取消息的版本号
* > 0 success else 获取版本号失败,可能响应消息中没有版本号,需要设置resultflag
*
*/
int32_t GetMessageVersion(const ::google::protobuf::Message &msg);
/**
* 删除消息的选项
* item取值有如下情况:
* a).MESSAGE_OPTION_VERSION_CHECK = 1, 删除API中记录版本对比选项
* b).MESSAGE_OPTION_DATA_VERSION = 2, 删除API中设置记录版本选项
* c).MESSAGE_OPTION_ASYNC_ID = 3 删除API中设置设置消息的异步ID选项
* d).MESSAGE_OPTION_MESSAGE_INVALID = 4 删除设置消息无效选项
* e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5, 删除设置设置消息的自动释放选项
* f).MESSAGE_OPTION_USER_BUFF = 6, 获取用户传入的自定义二进制数据
* g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7, API中设置回调的自动释放(异步模式生效)
* h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
* i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
*/
int DelMessageOption(const ::google::protobuf::Message &msg, int32_t item); // 为后续参数设置预留
/**
* @brief 根据用户输入的msg中的key值,获取msg消息的字段值,并填充到msg中。
*
* @param [INOUT] msg 用户输入的key值,返回指定字段填到msg中
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Get(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值,获取msg消息的字段值,并填充到msg中。
*
* @param [INOUT] msg 用户输入的key值,返回指定字段填到msg中
* @param [IN] condition 过滤条件
* @param [INOUT] cb 消息回调函数
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Get(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的req中的index名称,msg值,offset以及limit,通过索引获取多个记录的值填充到res中的vec结构中,并返回总记录数以及剩余记录数。
*
* @param [INOUT] req 用户输入的req
* @param [INOUT] res 用户输入的res
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Get(NS_TCAPLUS_PROTOBUF_API::IndexGetRequest& req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的req中的index名称,msg值,offset以及limit,通过索引获取多个记录的值填充到res中的vec结构中,并返回总记录数以及剩余记录数。
*
* @param [INOUT] req 用户输入的req
* @param [INOUT] res 用户输入的res
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Get(NS_TCAPLUS_PROTOBUF_API::GlobalIndexGetRequest& req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msgs中的key值,批量获取msg消息的字段值,并填充到msgs中?
*
* @param [INOUT] msgs 用户输入的key值列表,返回指定字段填到msgs中
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int BatchGet(std::vector< ::google::protobuf::Message * > *msgs, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg删除记录,并默认将成功删除的记录通过cb中OnRecv方法的参数返回给用户。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时将已经存在的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录。
*
* @param [IN] msg 要删除的数据记录msg
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int Del(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg删除记录,并默认将成功删除的记录旧值通过cb中OnRecv方法的参数返回给用户。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时将已经存在的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录。
*
* @param [IN] msg 要删除的数据记录msg
* @param [IN] condition 过滤条件表达式,仅当条件满足,修改操作才会执行
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,不会删除记录。
* @retval <0 失败,返回对应的错误码。
* @retval =0 成功。
*/
int Del(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg插入或更新记录,如果记录存在则更新指定记录的值,否则插入指定记录,并默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
* 用户可以通过记录的version判断实际执行的是插入操作还是更新操作,version == 1 表示实际执行的是插入操作,version > 1 表示实际执行的是更新操作。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置操作成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
* @note:仅当实际执行的是更新操作(即回调函数中记录version大于1)时,才会返回更新之前的数据,否则OnRecv回调函数传入的是用户请求中的msg指针。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置操作失败时将更新之前的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置操作成功或失败时不返回记录。
*
* @param [INOUT] msg 要插入或更新的数据记录msg
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int Set(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg插入或更新记录,如果记录存在则更新指定记录的值,否则插入指定记录,并默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
* 用户可以通过记录的version判断实际执行的是插入操作还是更新操作,version == 1 表示实际执行的是插入操作,version > 1 表示实际执行的是更新操作。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置操作成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
* @note:仅当实际执行的是更新操作(即回调函数中记录version大于1)时,才会返回更新之前的数据,否则OnRecv回调函数传入的是用户请求中的msg指针。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置操作失败时将更新之前的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置操作成功或失败时不返回记录。
*
* @param [INOUT] msg 要插入或更新的数据记录msg
* @param [IN] operation 在Set操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作。
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件表达式,仅当条件满足,Set才会执行
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [INOUT] cb 消息回调函数
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,不更新记录。
* @retval <0 失败,返回对应的错误码。
* @retval =0 成功。
*/
int Set(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg插入记录,并默认将插入成功的记录通过cb中OnRecv方法的参数返回给用户,如果key存在则报错退出。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置插入失败时将已经存在的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_RECORD_EXIST等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置插入成功或失败时不返回记录。
*
* @param [INOUT] msg 要插入的数据记录msg
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int Add(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加msg指定字段的值。字段为数值型变量。
* @param [INOUT] msg 数据记录msg,包含用户输入的key值,返回增量字段的结果值更新到msg中
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int FieldInc(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加指定字段的值。字段为数值型变量
* @param [INOUT] msg 用户输入的key值,返回增量字段的结果值更新到msg
* @param [IN] dottedpaths 字段名称的点分嵌套字符串
* @param [IN] lowerLimitDottedpaths 需要指定下界的字段名称的点分嵌套字符串,若为empty则不设置下界
* @param [IN] lowerLimit 需要指定的字段的下界值,若为NULL则不设置下界
* @param [IN] upperLimitDottedpaths 需要指定上界的字段名称的点分嵌套字符串,若为empty则不设置上界
* @param [IN] upperLimit 需要指定的字段的上界值,若为NULL则不设置上界
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成
*/
int FieldInc(const std::set<std::string> &dottedpaths,
::google::protobuf::Message *msg,
const std::set<std::string> &lowerLimitDottedpaths,
::google::protobuf::Message *lowerLimit,
const std::set<std::string> &upperLimitDottedpaths,
::google::protobuf::Message *upperLimit,
TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加msg指定字段的值。字段为数值型变量。
* @param [INOUT] msg 数据记录msg,包含用户输入的key值,返回增量字段的结果值更新到msg中
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [IN] operation 在FieldInc操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件表达式,仅当条件满足,修改操作才会执行
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,没有任何字段更新。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int FieldInc(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg,
const std::string &operation, const std::string &condition,
TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加指定字段的值。字段为数值型变量
* @param [INOUT] msg 用户输入的key值,返回增量字段的结果值更新到msg
* @param [IN] dottedpaths 字段名称的点分嵌套字符串
* @param [IN] lowerLimitDottedpaths 需要指定下界的字段名称的点分嵌套字符串,若为empty则不设置下界
* @param [IN] lowerLimit 需要指定的字段的下界值,若为NULL则不设置下界
* @param [IN] upperLimitDottedpaths 需要指定上界的字段名称的点分嵌套字符串,若为empty则不设置上界
* @param [IN] upperLimit 需要指定的字段的上界值,若为NULL则不设置上界
* @param [IN] operation 在FieldInc操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件表达式,仅当条件满足,修改操作才会执行
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,没有任何字段更新。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成
*/
int FieldInc(const std::set<std::string> &dottedpaths,
::google::protobuf::Message *msg,
const std::set<std::string> &lowerLimitDottedpaths,
::google::protobuf::Message *lowerLimit,
const std::set<std::string> &upperLimitDottedpaths,
::google::protobuf::Message *upperLimit,
const std::string &operation,
const std::string &condition,
TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,更新msg指定字段的值。服务端不存在的值会追加进去。
*
* @param [IN] msg 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int FieldSet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,更新msg指定字段的值。服务端不存在的值会追加进去。
*
* @param [IN] msg 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [IN] operation 在FieldSet操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件,仅当该条件满足时才会执行FieldSet操作。
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,没有任何字段更新。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int FieldSet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg,
const std::string &operation, const std::string &condition,
TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到msg中。
*
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [INOUT] msg 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int FieldGet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到msg中。
*
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [INOUT] msg 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [IN] condition 记录的过滤条件
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int FieldGet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到cb中。
*
* @param [INOUT] req 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int FieldGet(NS_TCAPLUS_PROTOBUF_API::BatchFieldGetRequest &req, TcaplusPbCallback *cb);
/**
* @brief 通过query描述的表达式在记录中进行查询,返回记录的局部数据内容,仅支持数组内的查询
*
* @param [INOUT] msg 数据记录msg,作为输入时包含主键的值,作为输出时包含响应返回的数据
* 注意,返回的msg会和输入的msg合并,即接口内部调用Message::MergeFrom
* @param [IN] query 查询语句,语法:
* query ::=
* GET repeated_field [ #\[ index_range [, index_range]* \] ] [ \[ inner_condition \] ]
* index_range ::=
* number [ - number ]
* 其中number的范围时 -1 ~ INT_MAX,-1表示数组最后一个位置
* 例如,GET mail_list #[1-9][domain=="qq.com"]
* @param [IN] queryOption 查询选项设置,见NS_TCAPLUS_PROTOBUF_API::TcaplusQueryOption
* @param [IN] condition 记录级别的过滤条件,仅当该条件满足时才会执行query操作,== ""则不作过滤。
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int Query(::google::protobuf::Message *msg, const std::string &query, int queryOption,
const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 通过operation描述的表达式执行对数组的操作,并默认将更新成功的记录通过cb中OnRecv方法的参数返回给用户。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
* 用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时将更新之前的数据通过cb中OnError方法的参数返回。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回更新之前的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录。
*
* @param [INOUT] msg 数据记录msg,包含用户输入的key值
* @param [IN] operation 对数组的操作表达式,即PUSH或POP操作
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件,仅当该条件满足时才会执行UpdateItem操作
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [INOUT] cb 消息回调函数
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,没有任何字段更新。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval =0 成功。全部字段更新成功。
*/
int UpdateItem(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的的msg中的key值,和dottedpaths指定的字段名称,获取List表中全部记录指定字段的值,并填充到cb中。
*
* @param [INOUT] req 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int ListGetAll(NS_TCAPLUS_PROTOBUF_API::ListGetAllRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msg的key值,删除List表中该key值下对应index的记录,并默认将成功删除的记录填充到cb中,ListBatchDeleteResponse.m_mapMsg的key为成功删除的记录index,value为msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")设置删除成功时不返回数据,如此,则cb中ListBatchDeleteResponse.m_mapMsg的key为成功删除的记录index,value均为空指针。
*
* @param [INOUT] req 要删除的数据记录msg
* @param [OUT] cb 其中的ListBatchDeleteResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功,至少有一条记录删除成功才会返回0
*/
int ListBatchDel(NS_TCAPLUS_PROTOBUF_API::ListBatchDeleteRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msg,在List表中指定位置后面添加记录,并默认将成功插入的记录的下标填充到ListAddAfterResponse.m_nElemIndex,ListAddAfterResponse.m_mapMsg为空。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "2")设置插入成功时返回最新数据,如此,则ListAddAfterResponse.m_mapMsg的key为成功插入或被淘汰记录的index,value为对应记录的msg指针。
*
* @param [INOUT] req 要插入的数据记录msg
* @param [OUT] cb 其中的ListAddAfterResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int ListAddAfter(NS_TCAPLUS_PROTOBUF_API::ListAddAfterRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msg,在List表中指定位置更新记录,并默认将更新成功后的记录填充到cb中,ListReplaceResponse.m_pMsg为更新后记录的指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时返回操作前的记录,如此,则cb中ListReplaceResponse.m_pMsg为更新前记录的指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时返回操作前的记录,如此,则cb中ListReplaceResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录,如此,则ListReplaceResponse.m_pMsg为空。
*
* @param [INOUT] req 要更新的数据记录msg以及index
* @param [OUT] cb 其中的ListReplaceResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int ListReplace(NS_TCAPLUS_PROTOBUF_API::ListReplaceRequest &req, TcaplusPbCallback *cb);
/**
* @brief 通过operation描述的表达式执行对数组的操作,并默认将更新成功后的记录填充到cb中,ListUpdateItemResponse.m_pMsg为更新后记录的指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时返回操作前的记录,如此,则cb中ListUpdateItemResponse.m_pMsg为更新前记录的指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时返回操作前的记录,如此,则cb中ListUpdateItemResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录,如此,则ListUpdateItemResponse.m_pMsg为空。
*
* @param [IN] req 操作请求,包含msg、操作表达式、条件过滤表达式
* @param [OUT] cb 其中的ListUpdateItemResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int ListUpdateItem(NS_TCAPLUS_PROTOBUF_API::ListUpdateItemRequest &req, TcaplusPbCallback *cb);
/**
* @brief 通过query描述的表达式在记录中进行查询,返回记录的局部数据内容,仅支持数组内的查询
*
* @param [INOUT] msg 数据记录msg,作为输入时包含主键的值,作为输出时包含响应返回的数据
* @param [IN] req 查询请求,包含msg、查询表达式、条件过滤表达式
* @param [OUT] cb 回调
* @retval TXHDB_ERR_RECORD_NOT_EXIST 记录不存在。
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足。
* @retval <0 失败,返回对应的错误码。表示没有任何字段更新。
* @retval 0 成功。全部字段更新成功。
*/
int ListQuery(NS_TCAPLUS_PROTOBUF_API::ListQueryRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的的msg中的key值,删除List表中指定key的所有记录,并填充到cb中。
*
* @param [INOUT] req 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int ListDelAll(NS_TCAPLUS_PROTOBUF_API::ListDelAllRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的的msg中的key值,在List表中指定key的指定下标记录,并填充到cb中。
*
* @param [INOUT] req 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int ListGet(NS_TCAPLUS_PROTOBUF_API::ListGetRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msg,在List表中指定位置删除记录,并默认在删除成功时将删除之前的记录填充到cb中,ListDeleteResponse.m_nElemIndex为成功删除的记录index,m_pMsg为msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时返回操作前的记录,如此,则cb中ListDeleteResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
* @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
* 用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录,如此,则ListDeleteResponse.m_pMsg始终为空。
*
* @param [INOUT] req 要删除的数据记录msg以及index
* @param [OUT] cb 其中的ListDeleteResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功
*/
int ListDel(NS_TCAPLUS_PROTOBUF_API::ListDeleteRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中指定信息,遍历List表所有记录,并填充到cb中。
*
* @param [INOUT] req 数据记录msg,包含用户输入的key值,返回指定字段填到msg中
* @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int ListTraverse(NS_TCAPLUS_PROTOBUF_API::ListTraverseRequest &req, TcaplusPbCallback *cb);
/**
* @brief 遍历表,消息会填充到msg中。
*
* @param [INOUT] msg 返回指定字段填到msg中
* @param [IN] condition 过滤条件
* @param [INOUT] cb 回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 遍历成功完成。
*/
int Traverse(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 遍历表,消息会填充到msg中。
*
* @param [INOUT] msg 返回指定字段填到msg中
* @param [INOUT] cb 回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 遍历成功完成。
*/
int Traverse(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 遍历表,消息会填充到msg中。
*
* @param [INOUT] msg 返回指定字段填到msg中
* @param [IN] condition 过滤条件
* @param [IN] dottedpaths 字段名称的点分嵌套字符串集
* @param [INOUT] cb 回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 遍历成功完成。
*/
int Traverse(::google::protobuf::Message *msg, const std::set<std::string> &dottedpaths, const std::string &condition, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入vecReq中的每个msg中的key值,设置对应记录的TTL值。
*
* @param [IN] vecReq 输入的每个msg和对应设置的TTL值,其中SetTTLRequest的msg包含用户输入的key值
* @param [IN] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int SetTTL(const std::vector<NS_TCAPLUS_PROTOBUF_API::SetTTLRequest> &vecReq, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入vecReq中的msg中的key值,设置对应记录的TTL值。
*
* @param [IN] vecReq 输入的msg和对应设置的TTL值,其中SetTTLRequest的msg包含用户输入的key值
* @param [IN] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int SetTTL(const NS_TCAPLUS_PROTOBUF_API::SetTTLRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的每个msg的key值,获取对应记录的TTL值。
*
* @param [IN] msgs 输入的msg列表,每个msg包含用户输入的key值
* @param [IN] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int GetTTL(const std::vector< ::google::protobuf::Message* > &msgs, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg的key值,获取对应记录的TTL值。
*
* @param [IN] msgs 输入的msg,包含用户输入的key值
* @param [IN] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int GetTTL(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 返回当前待处理消息数
*
* @retval 当前待处理消息计数
*/
size_t GetPendingCount() { return m_mapStatus.size();}
/**
* @brief 注册加密套件
*
* @param [IN] suite 加密套件
* @retval <0 失败,注册失败。
* @retval 0 创建一个协程并启动。
*/
int RegisterCipherSuite(CipherSuite *suite);
/**
* @brief 注销加密套件
*
* @param [IN] suite 加密套件
* @retval <0 失败,注销失败。
* @retval 0 成功,注销成功
*/
int UnregisterCipherSuite(CipherSuite *suite);
/**
* @brief 返回当前表中的记录数
*
* @param [IN] table_name 表名
* @param [OUT] cb 返回记录数的回调
* @retval <0 失败
* @retval 0 成功
*/
int GetCount(const char* table_name, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg中的索引值,删除对应的记录。
*
* @param [INOUT] req 用户输入的req
* @param [INOUT] res 用户输入的res
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。
*/
int Del(NS_TCAPLUS_PROTOBUF_API::IndexDeleteRequest& req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg更新记录,默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
*
* @param [INOUT] msg 要更新的数据记录msg
* @param [INOUT] cb 消息回调函数
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,不更新记录。
* @retval <0 失败,返回对应的错误码。
* @retval =0 成功。
*/
int Update(::google::protobuf::Message *msg, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msg更新记录,默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
*
* @param [INOUT] msg 要更新的数据记录msg
* @param [IN] operation 在Update操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作。
* PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
* POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
* 例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
* 例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
* 例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
* @param [IN] condition 过滤条件表达式,仅当条件满足,Update才会执行
* 当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
* 例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
* 例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
* @param [IN] resultFlag 设置数据的返回方式。
* @param [INOUT] cb 消息回调函数
* @retval COMMON_ERR_CONDITION_NOT_MATCHED condition不满足,不更新记录。
* @retval <0 失败,返回对应的错误码。
* @retval =0 成功。
*/
int Update(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, int resultFlag, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msgs,批量插入数据。
*
* @param [INOUT] msgs 用户输入的msgs列表。
* @param [IN] resultFlag 设置数据的返回方式。
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int BatchAdd(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msgs,批量删除数据。
*
* @param [INOUT] msgs 要删除的数据记录msgs列表。
* @param [IN] resultFlag 设置数据的返回方式。
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int BatchDelete(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msgs,批量更新数据。
*
* @param [INOUT] msgs 要更新的数据记录msgs列表。
* @param [IN] resultFlag 设置数据的返回方式。
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int BatchUpdate(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入的msgs,批量替换数据。
*
* @param [INOUT] msgs 要替换的数据记录msgs列表。
* @param [IN] resultFlag 设置数据的返回方式。
* @param [INOUT] cb 消息回调函数
* @retval <0 失败,返回对应的错误码。
* @retval 0 成功。至少有一个字段查询成功才会返回0。
*/
int BatchSet(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msg的key值,获取List表中该key值下对应index的记录,并默认将成功的记录填充到cb中,ListBatchGetResponse.m_mapMsg的key为查询成功的记录index,value为msg指针。 *
* @param [INOUT] req 要删除的数据记录msg
* @param [OUT] cb 其中的ListBatchGetResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功,至少有一条记录查询成功才会返回0
*/
int ListBatchGet(NS_TCAPLUS_PROTOBUF_API::ListBatchGetRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msgs向后或向前插入记录,并默认将成功的记录填充到cb中,ListBatchAddRequest.m_msgs的key为msg指针,value为插入方式(-2向前插入,-1向后插入);
* ListBatchAddRequest.m_cShifFlag可以设置list表淘汰方式; ListBatchAddResponse.m_mapMsg的key为查询成功的记录index,value为msg指针。 *
* @param [INOUT] req 要删除的数据记录msg
* @param [OUT] cb 其中的ListBatchAddResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功,至少有一条记录插入成功才会返回0
*/
int ListBatchAdd(NS_TCAPLUS_PROTOBUF_API::ListBatchAddRequest &req, TcaplusPbCallback *cb);
/**
* @brief 根据用户输入req中的msgs,更新List表中该key值下对应index的记录,并默认将成功的记录填充到cb中,ListBatchUpdateResponse.m_mapMsg的key为更新成功的记录index,value为msg指针。 *
* @param [INOUT] req 要更新的数据记录msg
* @param [OUT] cb 其中的ListBatchUpdateResponse用于接收请求执行结果
* @retval <0 失败,返回对应的错误码
* @retval =0 成功,至少有一条记录查询成功才会返回0
*/
int ListBatchUpdate(NS_TCAPLUS_PROTOBUF_API::ListBatchUpdateRequest &req, TcaplusPbCallback *cb);
/**
* @brief 与Init匹配的资源释放操作
*
*/
void Fini();
};
8. 常见问题
详见错误码含义和处理方法。